﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using GigaSite.Domain.Entities;
using GigaSite.Domain.Enums;
using GigaSite.Domain.Interfaces.Repositories;
using GigaSite.Domain.IoC;
using GigaSite.Web.Areas.ControlPanel.Models;
using GigaSite.Web.Models;

namespace GigaSite.Web.Areas.ControlPanel.Controllers
{
    /// <summary>
    /// Контроллер управления визитками
    /// </summary>
    public class ManageCardsController : BaseRootController
    {
        //
        // GET: /ControlPanel/ManageCards/
        /// <summary>
        /// Отображает панель управления визитками
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            return View();
        }

        /// <summary>
        /// Загружает коллекцию карточек в админку на основании указанного типа фильтрации
        /// </summary>
        /// <param name="predefinedFilter">тип фильтра</param>
        /// <param name="filterText">Текст фильтра для поиска</param>
        /// <returns>Коллекция элементов</returns>
        [HttpPost]
        public JsonResult GetCards(string predefinedFilter, string filterText)
        {
            try
            {
                // Репозиторий
                var repository = Locator.GetService<IBusinessCardsRepository>();

                // Карточки из БД
                IEnumerable<BusinessCard> dbCards = Enumerable.Empty<BusinessCard>();
                
                // На основании типа фильтра загружаем карточки из репозитория
                switch (predefinedFilter)
                {
                    case "all":
                        dbCards = repository.FindAll();
                        break;
                    case "moderated":
                        dbCards = repository.Search(c => c.Status == BusinessCardStatuses.Checking);
                        break;
                    case "search":
                        dbCards = repository.Search(c => c.Title.Contains(filterText) | c.Description.Contains(filterText));
                        break;
                    case "blocked":
                        dbCards = repository.Search(c => c.Status == BusinessCardStatuses.Blocked);
                        break;
                    default:
                        break;
                }

                // Преобразуем их в модели
                var cards = dbCards.OrderByDescending(c => c.DateCreated).Select(c => new BusinessCardModel(c)).AsEnumerable();

                // Отдаем коллекцию
                return JsonSuccess(cards);
            }
            catch (Exception e)
            {
                return JsonErrors(e);
            }
        }

        /// <summary>
        /// Сохраняет изменения в существующей визитке или создает новую
        /// </summary>
        /// <param name="id">Идентификатор визитки</param>
        /// <param name="cardType">Тип создания визитки</param>
        /// <param name="cardHolderType">Тип держателя визитки</param>
        /// <param name="status">Статус визитки</param>
        /// <param name="title">Заголовок визитки</param>
        /// <param name="description">Описание визитки</param>
        /// <param name="city">Город</param>
        /// <param name="email">Email</param>
        /// <param name="website">Web сайт</param>
        /// <param name="phones">Телефоны</param>
        /// <param name="collection">Коллекция отправленная с клиента</param>
        /// <returns>Информация об успешном или неуспешном сохранении</returns>
        [HttpPost]
        public JsonResult Save(long id, short cardType, short cardHolderType, short status, string title, string description, string city, string email, string website, string phones, FormCollection collection)
        {
            try
            {
                // Репозитории
                var cardsRepository = Locator.GetService<IBusinessCardsRepository>();
                var imagesRepository = Locator.GetService<IImagesRepository>();

                // Проверяем прислан ли нам файл
                bool fileSubmitted = false;
                string submittedFileURL = String.Empty;
                if (Request.Files["cardImage"] != null && Request.Files["cardImage"].ContentLength > 0)
                {
                    // Файл прислан, сохраняем его в файловой системе
                    fileSubmitted = true;
                    var submittedImage = imagesRepository.SavePostedFile(Request.Files["cardImage"]);
                    submittedFileURL = submittedImage.URI;
                }

                // сохраняем изменения или создаем новый объект
                if (id < 0)
                {
                    var newCard = new BusinessCard()
                                      {
                                          DateCreated = DateTime.Now,
                                          CardType = (BusinessCardTypes) cardType,
                                          HolderType = (BusinessCardHolderTypes) cardHolderType,
                                          CityId = 1,
                                          // TODO: сделать выбор города потом
                                          Description = description,
                                          Title = title,
                                          Email = email,
                                          WebSite = website,
                                          Phones = phones,
                                          Status = (BusinessCardStatuses) status,
                                          ImageURI = submittedFileURL
                                      };
                    cardsRepository.Add(newCard);
                }
                else
                {
                    // Ищем визитку
                    var card = cardsRepository.Load(id);
                    if (card == null)
                    {
                        throw new ObjectNotFoundException(string.Format("Визитка с идентификатором {0} не найдена", id));
                    }

                    // Обновляем
                    card.DateModified = DateTime.Now;
                    card.HolderType = (BusinessCardHolderTypes) cardHolderType;
                    card.Phones = phones;
                    card.Status = (BusinessCardStatuses) status;
                    card.CardType = (BusinessCardTypes) cardType;
                    card.Title = title;
                    card.Description = description;
                    card.WebSite = website;
                    card.Email = email;
                    if (fileSubmitted)
                    {
                        card.ImageURI = submittedFileURL;
                    }
                }

                // Сохраняет измениня
                cardsRepository.SubmitChanges();

                // Отправляем сообщение о том что все ок
                return Json(new {success = true, msg = "ok"});
            }
            catch (Exception e)
            {
                return Json(new {success = false, msg = e.Message});
            }
        }

        /// <summary>
        /// Удаляет визитку из системы
        /// </summary>
        /// <param name="id">Идентификатор визитки</param>
        /// <returns>Сообщение об успехе или неуспехе</returns>
        [HttpPost]
        public JsonResult Delete(long id)
        {
            try
            {
                // Репозиторий
                var repository = Locator.GetService<IBusinessCardsRepository>();

                // Ищем визитку
                var card = repository.Load(id);
                if (card == null)
                {
                    throw new ObjectNotFoundException(string.Format("Визитка с идентификатором {0} не найдена", id));
                }

                // Удаляем
                repository.Delete(card);
                repository.SubmitChanges();

                // Отправляем результат
                return JsonSuccess();
            }
            catch (Exception e)
            {
                return Json(new { success = false, msg = e.Message });
            }
        }
    }
}
